
# 异常和错误
"""
1. 代码的运行逻辑
    (1). 解释和编译 ：会首先检查代码的语法和结构是否正确，若不正确 ，则直接报错 ，也不会启动(错误)
    (2). 启动执行 ，在执行过程中报错，也会停止运行运行，到了出错的那一行体制运行。比如 ：被0除，索引越界 ，编码异常

2. 出错的处理方式 ：
    (1) 针对出现的错误，必须进行处理 ，但是在执行过程中出现的错误可以通过异常处理方式

3. 异常处理方式
try:
    可能执行错误的代码块
except:
    对错误代码进行处理

[finally:] : 在运行过程中，希望某段代码必须运行，就可以放在finally语句中。

4. 异常可以分类 ：通过分类，可以使得出错的提示更加准确 。
BaseException：所有异常的基类，用于处理所有异常情况。
Exception：常规异常的基类，用于处理大多数异常情况。
TypeError：类型错误，例如对非数字对象进行数学运算。
ValueError：数值错误，例如将一个字符串作为数字进行数学运算。
IndexError：索引错误，例如使用超出序列长度的索引值。
KeyError：字典键错误，例如使用不存在的字典键。
AttributeError：属性错误，例如尝试访问一个对象不存在的属性。
IOError：输入/输出错误，例如读写文件时发生错误。
ValueErrorException：与具体编程相关的错误，例如传递错误的参数类型或参数值。
ZeroDivisionError：除零错误，例如执行除以零的操作。
FileNotFoundError ： 文件不存在错误 ，例如找不到文件
UnicodeDecodeError: 文件编码错误 ，读取编码格式不正确

"""


#
# print("hello world")
#
# try:
#     print(1/0)
#     print("abc")
# except:
#     print("出错啦，暂时跳过")
#
# print("hello python ")

f = None

try:

    f = open('a.txt')

    content = f.read()
    print(content)

except FileNotFoundError as e:
    print("读取文件不存在，请检查:{}".format(e))

except UnicodeDecodeError as e:
    print("文件编码不正确，请检查:{}".format(e))

except Exception as e:
    print("未知错误:{}".format(e))

finally:        # 必须走这段代码
    if f:
        f.close()